# -*- coding: utf-8 -*-

 ###############################################
 ##                                             ##
 ##   Empresa Básica                             ##
 ##                                              ##
 ##                                              ##
 ##                                              ##
 ##   por Críptidos Digitales                    ##
 ##   GPL (c)2008                                ##
  ##                                             ##
    ###############################################

# print (0), "  reportes.manejador    begin"

import sys
from decimal import Decimal as dec
from sqlalchemy import desc, or_
from sqlalchemy.sql import func

import man
# from man import Acepcion, Atributo, Contacto, Direccion, Documento, Entidad, Operacion, PartidaDocumento, Proceso, Producto, Rol
from man import *

# print (0), "  reportes.manejador      definitions"


def acepcionExiste(**filtros):
    try:
        if 'codigo' in filtros.keys():
            registro = man.session().query(Acepcion).filter(Acepcion.codigo==unicode(filtros['codigo'])).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status=='actual').one()
        else:
            registro = man.session().query(Acepcion).filter(Acepcion.producto_id==filtros['producto_id']).filter(Acepcion.rol_id==filtros['rol_id']).filter(Acepcion.status=='actual').one()
        return registro
    except:
        return None


def agrega(data):
    # proceso = dameProceso({'id':damePedido({'id':data['pedido']}).proceso_id})
    # if not proceso:
    proceso = Proceso(data['proceso']['tipo'], data['proceso']['fecha'], data['proceso']['status'])
    man.session().add(proceso)
    man.session().flush()

    documento = Documento(proceso.id, data['tipo'], data['folio'], data['fecha'], data['entidad_id'], data['subtotal'], data['descuento'], data['impuesto'], data['total'], data['status'])
    proceso.documentos.append(documento)
    man.session().add(documento)
    man.session().flush()

    for partida in data['partidas']:
        partida = PartidaDocumento(documento.id, partida['producto_id'], partida['cantidad'], partida['costo'], partida['precio'], partida['descuento'], partida['impuesto'], partida['status'])
        documento.partidas.append(partida)
        man.session().add(partida)
    man.session().flush()

    operacion = Operacion("inventarios", data['fecha'], data['fecha'], documento.id, data['total'], data['status'])
    man.session().add(operacion)

    operacion = Operacion("caja", data['fecha'], data['fecha'], documento.id, data['total'], data['status'])
    man.session().add(operacion)

    operacion = Operacion("por cobrar", data['fecha'], data['fecha'], documento.id, data['total'], u"pagada")
    man.session().add(operacion)

    consolidaSalidas(documento.partidas)



    modificaFolio(data['folio'], documento.tipo)

    man.session().commit()
    return True


def consolidaSalidas(partidas):
    for registro in partidas:
        if registro.producto.actual:
            registro.producto.actual -= registro.cantidad
        else:
            registro.producto.actual = registro.cantidad
    man.session().flush()


def dameAcepcion(**filtros):
    try:
        if not filtros.has_key('status'):
            filtros['status'] = 'actual'
        registro = man.session().query(Acepcion).filter_by(**filtros).one()
    except:
        print sys.exc_info()
        print filtros
    return registro


def dameAcepciones(**filtros):      # print "manejador.dameAcepciones()"
    registros = []
    if filtros.has_key('rol_id'):
        if filtros.has_key('clasificacion'):
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.nombre.like("%s%%" % filtros['nombre'])).filter(Acepcion.rol_id==filtros['rol_id']).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.codigo.like("%s%%" % filtros['codigo'])).filter(Acepcion.rol_id==filtros['rol_id']).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.codigo).all()
        else:
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.nombre.like("%s%%" % filtros['nombre'])).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.codigo.like("%s%%" % filtros['codigo'])).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.codigo).all()
    else:
        if filtros.has_key('clasificacion'):
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.nombre.like("%s%%" % filtros['nombre'])).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.codigo.like("%s%%" % filtros['codigo'])).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.codigo).all()
        else:
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.nombre.like("%s%%" % filtros['nombre'])).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.codigo.like("%s%%" % filtros['codigo'])).order_by(Acepcion.codigo).all()
    return registros


# def dameAtributo(**filtros):
    # registro = man.session().query(Atributo).filter(Atributo.propietario==unicode(filtros['propietario'])).filter(Atributo.nombre==unicode(filtros['nombre'])).one()
    # return registro


def dameCuentasPorPagar():
    registros = man.session().query(Operacion).filter(Operacion.cuenta==u"pagos").filter(Operacion.status==u'Abierta').order_by(Operacion.fecha2.desc()).all()
    return registros


def dameCuentasPorCobrar():
    registros = man.session().query(Operacion).filter(Operacion.cuenta==u"cobros").filter(Operacion.status!=u'Cerrada').order_by(Operacion.vencimiento.desc()).all()

    return registros


def dameCliente(**filtros):
    if 'id' in filtros.keys():
        registro = man.session().query(Rol).filter(Rol.id==filtros['id']).one()
    elif 'nombre' in filtros.keys():
        registro = man.session().query(Rol).join(Rol.entidad).filter(Entidad.nombre==unicode(filtros['nombre'])).one()
    return registro


def clienteDefault():
    clienteDefaultId = int(atributoI(grupo=u'cliente', nombre=u'default').valor)
    registro = rolI(id=clienteDefaultId)
    return registro


def dameClientes(filtros={}):
    if filtros:
        registros = man.session().query(Rol).join(Rol.entidad).filter(Entidad.nombre.like("%s%%" % filtros['nombre'])).all()
    else:
        registros = rolesI(tipo=u'cliente')
    return registros


def dameDocumento(**filtros):
    if 'id' in filtros.keys():
        registro = man.session().query(Documento).filter(Documento.id==filtros['id']).one()
    return registro


def dameDocumentos(**filtros):
    registros = man.session().query(Documento).filter_by(**filtros).order_by(Documento.fecha).all()
    return registros


def dameFolio(tipoDocumento):
    print tipoDocumento
    print tipoDocumento == u'Factura'.capitalize()
    if tipoDocumento == u'Factura'.capitalize():
        folio = int(man.session().query(Atributo.valor).filter(Atributo.propietario==u'ventas').filter(Atributo.nombre==u'ultimoFolioFiscal').one()[0])
    elif tipoDocumento == u'Remisión'.capitalize():
        folio = int(man.session().query(Atributo.valor).filter(Atributo.propietario==u'ventas').filter(Atributo.nombre==u'ultimoFolioControl').one()[0])
    folio += 1
    return folio


def dameOperaciones(**filtros):
    registros = man.session().query(Operacion).filter(Operacion.documento_id==filtros['documento_id']).all()
    return registros


def damePartidas(**filtros):
    if 'producto_id' in filtros.keys():
        if 'tipo' in filtros.keys():
            registros = man.session().query(PartidaDocumento).filter(PartidaDocumento.producto_id==filtros['producto_id']).join(Documento).filter(Documento.tipo.in_(filtros['tipo'])).order_by(Documento.fecha.desc()).all()
        else:
            registros = man.session().query(PartidaDocumento).filter(PartidaDocumento.producto_id==filtros['producto_id']).order_by(PartidaDocumento.id.desc()).all()
    return registros


def dameProceso(**filtros):
    if 'id' in filtros.keys():
        registro = man.session().query(Proceso).filter(Proceso.id==filtros['id']).one()
    return registro


def producto(**filtros):
    registro = man.session().query(Producto).filter(Producto.id==filtros['id']).one()
    return registro



# def dameRoles(**filtros):
    # if 'nombre' in filtros.keys():
        # if 'like' in filtros['nombre']:
            # registros = man.session().query(Rol).filter(Rol.tipo==filtros['tipo']).join(Entidad).filter(Entidad.nombre.like("%s%%" % filtros['nombre'].replace('like ', ''))).order_by(Entidad.nombre).all()
    # else:
        # registros = man.session().query(Rol).filter_by(**filtros).join(Entidad).order_by(Entidad.nombre).all()
    # return registros


def tipoDocumentoVentaDefault():
    registro = atributoI(grupo=u'tipoDocumentoVenta', nombre=u'default')
    return registro


def tiposDocumento():
    registros = atributosI(grupo=u'tipoDocumento')
    return registros


def dameVentas(**filtros):
    fecha = filtros['inicio']
    totales = []

    while fecha <= filtros['termino']:
        ventas = dameVentasPorFecha(fecha)
        total = dec("0.00")
        for venta in ventas:
            total += venta.total
        totales.append({'fecha':fecha, 'total':total})
        fecha = fecha.addDays(1)
    return totales


def dameVentasPorFecha(fecha):
    registros = man.session().query(Documento).join(Proceso).filter(Proceso.tipo==u'Venta').filter(Documento.fecha==fecha.toPyDate()).filter(Documento.tipo!=u'Pedido').all()
    return registros


def modificaActual(**kwds):
    producto = dameProducto(id=kwds['producto_id'])
    producto.actual = kwds['actual']
    man.session().commit()


def totalDeProductos():
    return man.session().query(func.count(Producto.id)).one()[0]


def totalDeVentas():
    return man.session().query(func.count(Proceso.id)).filter(Proceso.tipo==u'Venta').one()[0]


def totalPorCobrar():
    return man.session().query(func.count(Operacion.id)).filter(Operacion.cuenta==u"cobros").filter(Operacion.status==u'Abierta').one()[0]


def totalPorPagar():
    return man.session().query(func.count(Operacion.id)).filter(Operacion.cuenta==u"pagos").filter(Operacion.status==u'Abierta').one()[0]



# print (0), "  reportes.manejador    end"

